package done.easy_601_700;

import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 661. Image Smoother 图片平滑器
 * <p>
 * 包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器
 * 来让每一个单元的灰度成为平均灰度 (向下舍入) ，平均灰度的计算是
 * 周围的8个单元和它本身的值求平均，如果周围的单元格不足八个，则
 * 尽可能多的利用它们。
 * <p>
 * 示例 1:
 * 输入:
 * [[1,1,1],
 * [1,0,1],
 * [1,1,1]]
 * 输出:
 * [[0, 0, 0],
 * [0, 0, 0],
 * [0, 0, 0]]
 * 解释:
 * 对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
 * 对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
 * 对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
 *
 * @author 大硕
 * 2019-04-12 10:54 PM
 **/
@SuppressWarnings("all")
public class ImageSmoother {

    public int[][] imageSmoother(int[][] M) {
        // 190416 first
        return null;
    }

    @Test
    public void test() {
        int[][] A = new int[][]{
                {1, 1, 1},
                {1, 0, 1},
                {1, 1, 1},
        };
        for (int i = 0; i < A.length; i++) {
            info(A[i]);
        }
        info("---------");
        int[][] B = imageSmoother(A);
        for (int i = 0; i < B.length; i++) {
            info(B[i]);
        }

        /*
         [[0, 0, 0],
          [0, 0, 0],
          [0, 0, 0]]
         */

        info("---------");

        int[][] C = new int[][]{
                {2, 3, 4},
                {5, 6, 7},
                {8, 9, 10},
                {11, 12, 13},
                {14, 15, 16}
        };
        for (int i = 0; i < C.length; i++) {
            info(C[i]);
        }
        info("---------");
        int[][] D = imageSmoother(C);
        for (int i = 0; i < D.length; i++) {
            info(D[i]);
        }

        /*
        [[4,4,5],
         [5,6,6],
         [8,9,9],
         [11,12,12],
         [13,13,14]]
        */
    }
}




















































/*
public int[][] imageSmoother(int[][] M) {
    int[][] ret = new int[M.length][M[0].length];

    // NO.1 行、列循环
    for (int i = 0; i < M.length ; i++) {
        for (int j = 0; j < M[i].length; j++) {

            // 口口口
            // 口区口  num = 1
            // 口口口
            // 正中间
            double a = M[i][j];
            int num = 1;

            // NO.2 上一行
            if (i >= 1) {
                // 口区口
                // 口区口  num = 2
                // 口口口
                // NO.2.1 上面
                a += M[i-1][j];
                num++;

                // 区区口
                // 口区口  num = 3
                // 口口口
                // NO.2.2 左上角
                if (j >= 1) {
                    a += M[i-1][j-1];
                    num++;
                }

                // 区区区
                // 口区口  num = 4
                // 口口口
                // NO.2.3 右上角
                if(j < M[i].length - 1){
                    a += M[i-1][j+1];
                    num++;
                }
            }

            // NO.3 下一行
            if (i < M.length - 1) {

                // 区区区
                // 口区口  num = 5
                // 口区口
                // NO.3.1 下面
                a += M[i+1][j];
                num++;

                // 区区区
                // 口区口  num = 6
                // 区区口
                // NO.3.2 左下角
                if(j >= 1) {
                    a += M[i+1][j-1];
                    num++;
                }

                // 区区区
                // 口区口  num = 7
                // 区区区
                // NO.3.3 右下角
                if(j < M[i].length - 1) {
                    a += M[i+1][j+1];
                    num++;
                }
            }

            // 区区区
            // 区区口  num = 8
            // 区区区
            // NO.4 左边
            if (j >= 1) {
                a += M[i][j-1];
                num++;
            }

            // 区区区
            // 区区区  num = 9
            // 区区区
            // NO.5 右边
            if (j < M[i].length - 1) {
                a += M[i][j+1];
                num++;
            }

            // 该节点的颜色是平均值, 向下取整
            ret[i][j] = (int) floor(a / num);
        }
    }
    return ret;
}
*/
